home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d1
/
bastips2.arc
/
BASCMATH.TXT
< prev
next >
Wrap
Text File
|
1988-11-29
|
5KB
|
117 lines
Converting Decimals to Fractions
(BYTE Magazine May 1985 by Dan Sandberg)
If you needed the solution of 11/17 + 13/19 - 139/323 - 37/15 +
47/21 in fractional form, finding the lowest common denominator might
be difficult. Instead, you can plug the decimal equivalent,
0.672357364 into the following program and obtain a solution of
7601/11305.
The program can help you factor 133133/1101373 to 11/91 or
verify that sine 60 degrees equals the square root of 3 divided by 2.
Program one, which returns a fraction for every decimal input,
uses a short algorithm. First, the program inverts the decimal to
obtain a number greater than 1. The routine saves the integer and
again inverts the decimal remainder. So it continues, until the
algorithm finds a denominator that supports an integer numerator.
If you want fractions printed in mixed form, add:
35 IF INT(A)>0 THEN PRINT INT(A);"+";C*(A-INT(A));'/';C
Program One:
10 INPUT A:B=0:C=1:D=ABS(A-INT(A))
20 IF D=0 THEN 40
30 E=1/D:F=C:C=INT(E)*C+B:B=F:D=E-INT(E):IF A*C<>INT(A*C) THEN 30
40 PRINT A*C;"/";C:GOTO 10
Program two is shorter and faster, but it may require higher
calculating precision. It never returns an inexact (even if close)
fraction; it returns an error if you input insufficient precision.
The program inverts the incoming number with a special algorithm until
it finds the denominator. If the fraction is too difficult (i.e.,
requiring greater precision), an overflow error will occur. If you
enter too few decimal digits, the program, which does not round A*B
to an integer, will warn you by writing a decimal numerator that is
close to an integer. With a precision of 12 digits, 0.333333333333
will generate the answer 1/3. However, 0.3333333333 will yield
0.9999999999/3. On the other hand, 0.333 gives the answer 333/1000,
a useful feature for those needing precise fractions. Others might
round A*B to the nearest integer. The constant, 0.00001, in line
110 is suitable for 12-digit calculating precision. Try constants
like 0.0001 and 0,000001 to produce the best possible conversion
capability. For mixed output, you can add:
130 PRINT INT(A);"+";(A-INT(A))*B;"/";B
Program Two:
100 INPUT A:C=ABS(A):B=1
110 B=B/C:C=(1/C)-INT(1/C):IF C>0.00001 THEN 110
120 B=INT(B):PRINT A*B;"/";B:GOTO 100
Program three detects constants like pi, the square root of 2,
and square root of 3; enter the sine 60 degrees (0.8660254) and get
the square root of 3 divided by 2. The program divides and multiplies
the incoming decimals by the constants, one at a time, and uses a
slightly modified version of program two as a subroutine to determine
whether the constants form part of the fraction. The decimal equivalent
of arctan(-1), -0.7853983, gives the answer -pi/4. Arcsin -1 returns
-pi/2. You need not struggle with tables.
Note that the program always places the square root in the
numerator. Therefore, 1 divided by the square root of 3 will appear
as SQR 3/3. To eliminate this, simply add:
125 B=INT(B):IF SQR(B)=H/A THEN L$=K$:K$="":A=A*B:B=1
Program Three:
10 K$="":L$="":INPUT H:A=H:GOSUB 100
20 K$="sqr 2":A=H/SQR(2):GOSUB 100
30 K$="sqr 3":A=H/SQR(3):GOSUB 100
40 K$="sqr 5":A=H/SQR(5):GOSUB 100
45 PI=3.141592653589793#
50 K$="PI":A=H/PI:GOSUB 100
60 K$="PI exp 2":A=H/PI/PI:GOSUB 100
70 K$="":L$="PI":A=H*PI*PI:GOSUB 100
100 C=ABS(A):B=1
110 B=BC:C=(1/C)-INT(1/C):IF B>10000 THEN RETURN
120 IF C>0.00001 THEN 110
130 B=INT(B):PRINT A*B;K$;"/";B;L$:END
-----------------------------------------------------------------
Turbo Primes
(PC World August 1986 Star-Dot-Star)
PRIMES.BAS (PC World Nov 1985 *.*) ran faster than the routine
used in the PC AT speed trials in "AT: The PC's Powerful Partner"
(PC World Vol 2 No 13). PRIMES2.BAS is faster still. It finds all
primes less than 1000 in just 14 seconds. For numbers above 1000,
the speed difference is even more pronounced.
PRIMES2.BAS maintains an array of markers, one for each number
in the range to be calculated. Once each number is evaluated, the
program steps through the array by multiples of that number and marks
each of those array positions with a 1. Next, the program increases
the value to be tested by 1 and checks the array to see if that value's
position has been marked. If it has not, the value is displayed on
screen, and its multiples in the array are marked. This process
continues until all values in the range have been tested. Note that
PRIMES2.BAS will run even faster if you delete line 150.
10 'PRIMES2.BAS
100 CLS:KEY OFF:DEFINT A-Z
110 INPUT "Primes up to: ",N
120 CLS:DIM M(N):T1$=TIME$:PU$=STRING$(LEN(STR$(N)),"#")
130 FOR C=2 TO N
140 IF M(C) THEN 190
150 PRINT USING PU$;C;
160 FOR L=C*2 TO N STEP C
170 M(L)=1
180 NEXT
190 NEXT
200 T2$=TIME$:PRINT:PRINT
210 T1=3600*VAL(MID$(T1$,1,2))+60*VAL(MID$(T1$,4,2))+VAL(MID$(T1$,7,2))
220 T2=3600*VAL(MID$(T2$,1,2))+60*VAL(MID$(T2$,4,2))+VAL(MID$(T2$,7,2))
230 PRINT "Calculation took";T2-T1;"seconds."
240 END